#include <stdio.h>
#include <string.h>

#define NUM_STR 5
#define MAX_STR_LEN 256

void input_strings(char *str[], int n)
{
    // 参数str指向一个字符指针数组
    // 从键盘读取字符串并存储在二维数组str中
    printf("请输入%d个字符串:\n", n);
    int i = 0;
    for(i = 0; i < n; i++)
    {
        // 利用fgets函数但从键盘输入
        fgets(str[i], MAX_STR_LEN, stdin);
        // fgets函数的特点是每一行末尾的'\n'也被包含的字符串中
    }
}

void sort_strings(char *str[], int n)
{
    // 参数str指向一个字符指针数组
    // 使用选择排序框架，对数组中的字符串进行排序
    int i, j;
    // 对str[i]~str[n-1]之间的所有字符串进行排序
    for(i = 0; i < n - 1; i++)
    {
        //存储当前列表中最小字符串的下标
        int current_min = i;
        // 从str[i+1]到str[n-1]之间的字符串选择最小的字符串
        for(j = i + 1; j < n; j++)
        {
            if (strcmp(str[j], str[current_min]) < 0)
            {
                // 在字典序下str[j]比当前最小值str[current_min]要小
                current_min = j;
            }
        }
        // 交换str[i]和str[current_min]
        char temp[MAX_STR_LEN] = {0};
        // strcpy相当于字符串版本的赋值
        strcpy(temp, str[i]);
        strcpy(str[i], str[current_min]);
        strcpy(str[current_min], temp);
    }
}

void output_strings(char *str[], int n, char *filename)
{
    FILE *fout = fopen(filename, "w");
    int i = 0;
    for(i = 0; i < n; i++)
    {
        // 输出字符串
        fputs(str[i], fout);
        // 因为字符串是通过fgets函数的，字符串的末尾都有'\n'，因此不需要人工补充
    }
    fclose(fout);
}

int main(int argc, char *argv[])
{
    // 使用二维数组存储5个字符串
    char str[NUM_STR][MAX_STR_LEN] = {{0}};
    char *str_ptr_array[NUM_STR] = {str[0], str[1], str[2], str[3], str[4]};
    input_strings(str_ptr_array, NUM_STR);
    sort_strings(str_ptr_array, NUM_STR);
    // 将排序后的字符串输出到string.dat文件
    output_strings(str_ptr_array, NUM_STR, "string.dat");
    return 0;
}